import Vue from "vue";
import VueRouter from "vue-router";
Vue.use(VueRouter)

import { readToken, deleteToken } from "@/utils/auth"
import store from "@/store"

// // 增强 push 方法
// // 1. 备份 VueRouter.prototype.push 方法
// const originPush = VueRouter.prototype.push
// // 2. 增强 push 方法
// VueRouter.prototype.push = function(location,okCallback,errorCallback){
//     if(okCallback || errorCallback){
//         originPush.call(this,location,okCallback,errorCallback)
//     }else{
//         originPush.call(this,location).catch(()=>{})
//     }
// }

// // 增强 replace 方法
// // 1. 备份 VueRouter.prototype.replace 方法
// const originReplace = VueRouter.prototype.replace
// // 2. 增强 replace 方法
// VueRouter.prototype.replace = function(location,okCallback,errorCallback){
//     if(okCallback || errorCallback){
//         originReplace.call(this,location,okCallback,errorCallback)
//     }else{
//         originReplace.call(this,location).catch(()=>{})
//     }
// }


// 封装 增强方法
// 创建一个增强的方法
function enhance(source, type) {
    // 1. 备份 VueRouter.prototype[type] 方法
    const origin = source.prototype[type]
    // 2. 增强 方法
    source.prototype[type] = function (location, okCallback, errorCallback) {
        if (okCallback || errorCallback) {
            origin.call(this, location, okCallback, errorCallback)
        } else {
            origin.call(this, location).catch(() => { })
        }
    }
}
// 增强 VueRouter 的 push 方法
enhance(VueRouter, "push")
// 增强 VueRouter 的 replace 方法
enhance(VueRouter, "replace")

import routes from "./routes"
let router = new VueRouter({
    mode: "history",
    routes,
    scrollBehavior(to, from, savedPosition) {  //滚动条行为
        // to : 即将要进入的路由对象
        // from : 现在要离开的路由对象
        // savedPosition:  保存的滚动条的位置【通过浏览器前进后退才会纪录位置】
        // console.log(to)
        // console.log(from)
        // console.log(savedPosition)  //  null

        if (savedPosition) {
            return savedPosition;  //通过浏览器前进后退才会纪录位置，返回位置
        } else {
            return { x: 0, y: 0 };  //正常编程式路由导航/ router-link  直接回到最顶部
        }

    }
})

// 需要登录【鉴权】的路由 数组
let isLoginArr = ["/trade", "/pay", "/paysuccess", "/center"];

//全局前置路由守卫
router.beforeEach(async (to, from, next) => {
    // to :  即将要进入的路由对象
    // from : 现在要离开的路由对象
    // next : 确认要进入的路由对象

    // console.log(to)
    // console.log(from)

    // 获取本地存储的token
    let token = readToken();
    //判断 是否存在token
    if (token) {
        //存在token, 说明登录过，继续获取 vuex 中的 用户信息

        //获取用户信息
        let userInfo = store.state.user.userInfo;

        //判断是否在 vuex 获取到用户信息
        if (userInfo.id) {
            //说明 存在 用户信息，直接放行。
            // console.log("说明 存在 用户信息，直接放行。")
            next();
        } else {
            //没获取到用户信息,【初次登录或刷新了浏览器】 通过 token 发送请求获取用户信息
            // console.log("没获取到用户信息,【初次登录或刷新了浏览器】 通过 token 发送请求获取用户信息");
            //调用store  方法 获取用户信息
            try {
                //token 有效，获取用户信息成功，将用户信息存入到vuex 中，然后放行
                await store.dispatch("user/getUserInfo");
                // console.log("token 有效，获取用户信息成功，将用户信息存入到vuex 中，然后放行")
                next();

            } catch (error) {
                //token 过期，获取用户信息失败，删除本地token，跳转至登录页面
                // console.log("token 过期，获取用户信息失败，删除本地token,跳转至登录页面")
                //删除token
                deleteToken();
                //跳转至登录
                next("/login");
            }


        }

    } else {
        //不存在token，说明没有登录，不能访问敏感路由，【支付、订单、交易】
        // console.log("不存在token，说明没有登录，不能访问敏感路由，【支付、订单、交易】")
        if (isLoginArr.includes(to.path)) {
            next("/login");
        } else {
            next();
        }
    }

    next();

})


//暴露路由对象
export default router;